package gruppoSoluzione.mainService;

import gruppoSoluzione.mainService.services.HttpFileServer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import server.IHTTPServer;

/**
 * Un Server HTTP configurabile, basato sul Design Pattern Strategy e
 * sull'interfaccia che astrae sulle strategie 'HTTPService'.
 * 
 * Responsabilità : decidere (sulla base di una logica opportuna) quale
 * servizio utilizzare ed invocarlo.
 * 
 * @author Alessandro Martinelli
 */
public class MainHttpServer implements IHTTPServer {

	private HashMap<String, HTTPService> services = new HashMap<String, HTTPService>();

	private HttpFileServer fileServerService;

	private String service;
	private String params = "";

	@Override
	public ArrayList<String> elaboraRispostaHTTP(List<String> richiestaHTTP) {

		String uri = findUri(richiestaHTTP);

		evalServiceInfo(uri);
	
		ServiceParams serviceParams = new ServiceParams(params);

		HTTPService httpService = services.get(service);
		if (httpService == null) {
			httpService = fileServerService;
			serviceParams.addParam("file", service);
		}

		return httpService.getServiceResult(serviceParams);
	}

	private void evalServiceInfo(String uri) {
		String[] uriParts = uri.split("\\?");
		service = "none";
		if (uriParts.length > 0) {
			service = uriParts[0];
			if (uriParts.length > 1) {
				params = uriParts[1];
			}
		}
	}

	private String findUri(List<String> richiestaHTTP) {
		String firstLine = richiestaHTTP.get(0);

		String[] firstLineParts = firstLine.split(" ");

		String uriPart = firstLineParts[1];

		String uri = uriPart.substring(uriPart.indexOf("/") + 1);

		return uri;
	}

	/**
	 * Imposta il servizio di File Server, che questo Server utilizza come
	 * default. Tale servizio verrà invocato aggiungendo l'URI ai parametri del
	 * servizio, usando la parola chiave 'file'
	 * 
	 * @param fileServerService
	 */
	public void setFileServerService(HttpFileServer fileServerService) {
		this.fileServerService = fileServerService;
	}

	/**
	 * Aggiunge eventuali servizi specifici, dato un nome e una implementazione
	 * di HTTPService. Il servizio verrà utilizzato quando name compare
	 * nell'URI
	 * 
	 * @param fileServerService
	 */
	public void addService(String name, HTTPService service) {
		services.put(name, service);
	}
}
